package gui;

import java.awt.BorderLayout;
import java.awt.EventQueue;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.util.ArrayList;

import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.border.EmptyBorder;
import javax.swing.border.TitledBorder;
import javax.swing.table.DefaultTableModel;
import javax.swing.JScrollPane;
import javax.swing.JButton;

import com.toedter.calendar.JDateChooser;

import javax.swing.JLabel;
import javax.swing.JComboBox;
import javax.swing.JTable;
import javax.swing.JTextField;

import negocio.Recado;
import negocio.RecadoControlador;
import negocio.Usuario;
import negocio.UsuarioControlador;

import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;

public class RecadosEnviados extends JFrame {
	
	private JPanel contentPane;
	private JPanel panel;
	private JPanel panel_1;
	private JButton btnVerRecado;
	private JButton btnSalir;
	private JPanel panel_2;
	private JPanel panel_3;
	private JDateChooser fechaDesde;
	private JDateChooser fechaHasta;
	private JComboBox comboDestino;
	private JButton btnBuscar;
	private DefaultTableModel model = new DefaultTableModel();
	private ArrayList<Recado> recados = new ArrayList<Recado>();
	private RecadosEnviados recadosEnviados;
	private RecadoVer recadoVerEnviado = null;
	private Usuario usuario;
	private JTable table;
	
	public void nullRecadosVerEnviado()
	{
		recadoVerEnviado = null;
	}
	
	private void llenarCombo() 
	{
		ArrayList<Usuario> destino = UsuarioControlador.getAll();
		comboDestino.removeAllItems();
		for(Usuario u : destino)
		{
				comboDestino.addItem(u);
		}
		comboDestino.insertItemAt("", 0);
		comboDestino.setSelectedIndex(0);
	}
	
	public void llenarTabla()
	{
		model.setRowCount(0);
		ArrayList <String> fila = new ArrayList<String>();
		recados = RecadoControlador.getAll();
		ArrayList<String> encabezado = new ArrayList<String>();
		encabezado.add("Fecha");
		encabezado.add("Hora Envio");
		encabezado.add("Destinatario");
		encabezado.add("Asunto");
		
		model.setColumnIdentifiers(encabezado.toArray());
		
		filtrarPorRemitente(recados, usuario);
		filtrarPorDestinatario(recados, comboDestino);
		filtrarPorFechaEnvio(recados, fechaDesde, fechaHasta);		
		filtrarEliminados(recados);
		for(Recado r: recados)
		{
				fila.add(r.getFechaRecado().toString());
				fila.add(r.getHora().toString());
				fila.add(r.getReceptor().getNombre()+" "+r.getReceptor().getApellido());
				if(r.getAsunto()!=null)
					fila.add(r.getAsunto());
				else
					fila.add("(sin asunto)");
				fila.add(r.getEstado());
				
				model.addRow(fila.toArray());
				fila.removeAll(fila);
		}
		table.setModel(model);
		table.getColumnModel().getColumn(0).setPreferredWidth(75);
		table.getColumnModel().getColumn(0).setMinWidth(75);
		table.getColumnModel().getColumn(0).setMaxWidth(70);
		table.getColumnModel().getColumn(1).setPreferredWidth(70);
		table.getColumnModel().getColumn(1).setMinWidth(70);
		table.getColumnModel().getColumn(1).setMaxWidth(70);
		table.getColumnModel().getColumn(2).setPreferredWidth(105);
		table.getColumnModel().getColumn(2).setMinWidth(105);
		table.getColumnModel().getColumn(2).setMaxWidth(300);
		table.getColumnModel().getColumn(3).setPreferredWidth(140);
		table.getColumnModel().getColumn(3).setMinWidth(140);
		table.setAutoResizeMode(JTable.AUTO_RESIZE_LAST_COLUMN);
	}
	
	private void filtrarPorRemitente(ArrayList<Recado> recados,	Usuario usuario)
	{
		for (int i = 0; i<recados.size();)
		{
			if(!recados.get(i).getRemitente().getDni().equals(usuario.getDni()))
			{
				recados.remove(i);
			}
			else
				i++;
		}
		
	}

	private void filtrarPorFechaEnvio(ArrayList<Recado> recados, JDateChooser fechaDesde, JDateChooser fechaHasta) 
	{
		if(fechaDesde.getDate()==null && fechaHasta.getDate()==null)
		{
			return;
		}

		else if(fechaDesde.getDate()==null)
		{
		    java.sql.Date fechaMax = new java.sql.Date(fechaHasta.getDate().getYear(), fechaHasta.getDate().getMonth(), fechaHasta.getDate().getDate());
		    
			for(int i = 0; i<recados.size();)
			{
				if(recados.get(i).getFechaRecado().after(fechaMax))
				{
					recados.remove(i);
				}	
				else
					 i++;
			}
		}
		else if(fechaHasta.getDate()==null)
		{
		    java.sql.Date fechaMin = new java.sql.Date(fechaDesde.getDate().getYear(), fechaDesde.getDate().getMonth(), fechaDesde.getDate().getDate());
		    
			for(int i = 0; i<recados.size();)
			{
				if(recados.get(i).getFechaRecado().before(fechaMin))
				{
					recados.remove(i);
				}	
				else
					 i++;
			}
		}
		else
		{
		    java.sql.Date fechaMax = new java.sql.Date(fechaHasta.getDate().getYear(), fechaHasta.getDate().getMonth(), fechaHasta.getDate().getDate());
		    java.sql.Date fechaMin = new java.sql.Date(fechaDesde.getDate().getYear(), fechaDesde.getDate().getMonth(), fechaDesde.getDate().getDate());
		    
			for(int i = 0; i<recados.size();)
			{
				if(recados.get(i).getFechaRecado().after(fechaMax))
				{
					recados.remove(i);
				}	
				
				else if(recados.get(i).getFechaRecado().before(fechaMin))
				{
					recados.remove(i);
				}
				else
					 i++;
			}
		}
	}
	
	private void filtrarEliminados(ArrayList<Recado> recados) 
	{
		for(int i = 0; i<recados.size();)
		{
			if(recados.get(i).getEliminadoEnviados()==true)
			{
				recados.remove(i);
			}
			else
				 i++;
		}
	}

	private void filtrarPorDestinatario(ArrayList<Recado> recados, JComboBox comboDestino) 
	{
		if(comboDestino.getSelectedIndex()==0)
		{
			return;
		}
		else
			{
				Usuario destino = (Usuario) comboDestino.getSelectedItem();
				for(int i = 0; i<recados.size();)
				{
					if(!recados.get(i).getReceptor().equals(destino))
					{
						recados.remove(i);
					}
					else
						 i++;
				}
			}
	}
	
	/**
	 * Launch the application.
	public static void main(String[] args) {
		EventQueue.invokeLater(new Runnable() {
			public void run() {
				try {
					RecadosEnviados frame = new RecadosEnviados();
					frame.setVisible(true);
				} catch (Exception e) {
					e.printStackTrace();
				}
			}
		});
	}
	 */

	/**
	 * Create the frame.
	 */
	public RecadosEnviados(Recados padreRecados, Usuario usuario) {
		this.usuario=usuario;
		recadosEnviados= this;
		addWindowListener(new WindowAdapter() {
			public void windowClosing(WindowEvent e){
				padreRecados.nullRecadosEnviados();
				padreRecados.llenarTabla();
				dispose();
			}
		});
		
		setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
		setBounds(100, 100, 545, 445);
		contentPane = new JPanel();
		contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
		contentPane.setLayout(new BorderLayout(0, 0));
		setContentPane(contentPane);
		
		panel = new JPanel();
		panel.setBorder(new EmptyBorder(5, 5, 5, 5));
		contentPane.add(panel, BorderLayout.CENTER);
		panel.setLayout(null);
		
		panel_1 = new JPanel();
		panel_1.setBounds(10, 132, 500, 214);
		panel_1.setLayout(null);
		panel_1.setBorder(new TitledBorder(null, "Resultados de busqueda", TitledBorder.LEADING, TitledBorder.TOP, null, null));
		panel.add(panel_1);
		
		JScrollPane scrollPane = new JScrollPane();
		scrollPane.setBounds(6, 16, 484, 191);
		panel_1.add(scrollPane);
		
		table = new JTable(){
			@Override
			public boolean isCellEditable(int row, int colum)
			{
				return false;
			}
		};
		scrollPane.setViewportView(table);
		
		panel_2 = new JPanel();
		panel_2.setBounds(10, 11, 501, 110);
		panel_2.setBorder(new TitledBorder(null, "Busqueda", TitledBorder.LEADING, TitledBorder.TOP, null, null));
		panel.add(panel_2);
		panel_2.setLayout(null);
		
		panel_3 = new JPanel();
		panel_3.setBounds(10, 14, 237, 52);
		panel_3.setLayout(null);
		panel_3.setBorder(new TitledBorder(null, "Busqueda por fecha", TitledBorder.LEADING, TitledBorder.TOP, null, null));
		panel_2.add(panel_3);
		
		fechaDesde = new JDateChooser();
		fechaDesde.setBounds(42, 16, 67, 20);
		panel_3.add(fechaDesde);
		
		fechaHasta = new JDateChooser();
		fechaHasta.setBounds(153, 16, 67, 20);
		panel_3.add(fechaHasta);
		
		JLabel lblDesde = new JLabel("Desde");
		lblDesde.setBounds(6, 22, 38, 14);
		panel_3.add(lblDesde);
		
		JLabel lblHasta = new JLabel("Hasta");
		lblHasta.setBounds(119, 22, 38, 14);
		panel_3.add(lblHasta);
		
		btnBuscar = new JButton("Buscar");
		btnBuscar.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				llenarTabla();
			}
		});
		btnBuscar.setBounds(356, 76, 139, 23);
		panel_2.add(btnBuscar);
		
		JLabel lblDestinatario = new JLabel("Destinatario");
		lblDestinatario.setBounds(257, 30, 58, 14);
		panel_2.add(lblDestinatario);
		
		comboDestino = new JComboBox();
		comboDestino.setBounds(356, 27, 139, 20);
		panel_2.add(comboDestino);
		
		btnVerRecado = new JButton("Ver recado");
		btnVerRecado.addMouseListener(new MouseAdapter() {
			@Override
			public void mouseClicked(MouseEvent e) {
				if(recadoVerEnviado==null)
				{
					recadoVerEnviado = new RecadoVer(usuario, recados.get(table.getSelectedRow()),padreRecados,recadosEnviados);
				}
				recadoVerEnviado.setVisible(true);
			}
		});
		btnVerRecado.setBounds(10, 357, 99, 23);
		panel.add(btnVerRecado);
		
		btnSalir = new JButton("Salir");
		btnSalir.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				padreRecados.nullRecadosEnviados();
				padreRecados.llenarTabla();
				dispose();
			}
		});
		btnSalir.setBounds(421, 357, 89, 23);
		panel.add(btnSalir);
		
		JButton button = new JButton("Borrar");
		button.addMouseListener(new MouseAdapter() {
			@Override
			public void mouseClicked(MouseEvent arg0) {
				if(table.getSelectedRow()!=-1)
				{
					RecadoControlador.cambiarEstadoEnviados(recados.get(table.getSelectedRow()), true);
					llenarTabla();
					if(table.getRowCount()>0)
						table.changeSelection(0, 0, false, false);
				}
			}
		});
		button.setBounds(119, 357, 99, 23);
		panel.add(button);
		
		llenarCombo();
		llenarTabla();
		if (recados.size()>0)
		{
			table.changeSelection(0, 0, false, false);
		}
		else
		{
			btnVerRecado.setVisible(false);	
		}
	}
}
